﻿using System;
using System.Text;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using CSBackup_Web.Sources.Override;

namespace CSBackup_Web.Sources
{
    public class Log
    {
        //此只读字符串对应ToolWriteLog.h里的宏定义LOG_FILE_NAME
        //请勿随意更改，如.h文件里做了更改，则此处应同样变化
        private static readonly string LOGFILENAME = @"log.txt";

        /// <summary>
        /// 这个函数仅仅只能装载原C++代码ToolWriteLog.cpp里的
        /// SaveLogFile函数产生的日志文件，因为此函数实现依赖
        /// SaveLogFile函数里内定的记录格式
        /// </summary>
        /// <returns>
        /// 0: 参数错误
        /// -1: Log文件不存在
        /// 1: 成功读取
        /// </returns>
        public static int LoadOldLogFile(List<List<string>> logInfo, ProjectInfo projInfo)
        {
            if (null == projInfo)
                return 0;

            //原C++代码里日志文件路径固定在projectLocation\log.txt
            string log = Path.Combine(projInfo.PrjLocation, LOGFILENAME);
            if (!File.Exists(log))
                return -1;

            //由于用户每次操作都可能产生新的日志记录，又由于原来是使用txt文件来
            //记录日志信息，所以遍历比较是否有新记录要加载的效率还不如重新加载一次
            logInfo.Clear();
            //日志条目过多时，装载会花费一些时间，这段时间内，要阻止用户操作界面
            /*
            mnsMenu1.Enabled = false;
            tabContainer.Enabled = false;
            SetProcStatus(@"正在加载日志文件，请稍等...");
            */

            int index = 0;
            int len = 0;
            string line = string.Empty;
            string time = string.Empty;
            string depict = string.Empty;
            List<string> item = new List<string>();
            using (FileStream fs = File.OpenRead(log))
            {
                //以何种编码格式读取文件需谨慎考虑并实际测试是否在不同系统下都没问题
                using (StreamReader sr = new StreamReader(fs, Encoding.Default))
                {
                    while ((line = sr.ReadLine()) != null)
                    {
                        //原C++代码写一条日志记录就是一行，且格式固定是
                        //“年-月-日 小时:分钟:秒钟 周几 描述”，
                        //所以寻找第3个空格
                        len = line.Length;
                        index = 0;
                        for (int i = 0; (index < len) && (i < 3); ++index)
                        {
                            if (' ' == line[index])
                                ++i;
                        }
                        --index;  //做循环变量退出时多加了1
                        //如果没有描述，则丢弃这条日志记录
                        if (len - 1 == index)
                            continue;

                        time = line.Substring(0, index);
                        depict = line.Substring(index + 1);
                        item.Add(time);
                        item.Add(depict);
                        logInfo.Add(item);
                    }
                }
            }

            /*
            //界面恢复
            mnsMenu1.Enabled = true;
            tabContainer.Enabled = true;
            SetProcStatus(string.Empty);
            */

            return 1;
        }
    }
}